package DigiJoe;

import java.util.ArrayList;
import java.util.Set;


public class ANDGate extends DigitalGate {

    //konstruktor
    public ANDGate(int MaxInputPort, int MaxOutputPort){
        super(MaxInputPort, MaxOutputPort);
    }

    @Override
    public void gateLogic () throws Exception {
        //regi kimenetek lementese
        ArrayList<Sign> results = new ArrayList<Sign>();

        //portok lekerese
        Set<Integer> tempSet = outputList.keySet();

        //minden portra lekerjuk a vezetekeket
        for (Integer integer : tempSet) {
            ArrayList<Wire> t = outputList.get(integer);
            //minden vezeteket elmentunk hogy kesobb ossze tudjuk hasonlitani
            for (Wire wire : t) {
                results.add(wire.getDigitalValue());
            }
        }

        //alapbol igazat adunk ki
        boolean result = true;
        
        //minden bemenetrol adatkeres es kimenet eldontese
        for(int i =0 ; i<inputList.size(); i++ ){
            for(Wire input : inputList.get(i)){
                //ha valamelyik ertek alacsony akkor a kimenet is alacsony
                if(input.getDigitalValue() == Sign.Low)
                    result = false;
            }
        }

        //minden kimenetre adatkiadas
        //minden port
        for(int i = 0; i<outputList.size(); i++){
            //minden port minden vezeteke
            for(Wire output : outputList.get(i)){
                if(result){
                    //high
                   output.setDigitalValue(Sign.High);
                }
                else{
                    //low
                   output.setDigitalValue(Sign.Low);
                }
            }
        }

        //eredmeny ellenorzes, ugyanolyan sorrendben megyunk vegig igy ellenorizve
        int i=0;
        //minden port
        for (Integer integer : tempSet) {
            ArrayList<Wire> t = outputList.get(integer);
            //minden vezetek
            for (Wire wire : t) {
                if (wire.getDigitalValue() != results.get(i))
                {
                    //valtozas jelentese
                    setChanged();
                    notifyObservers("StateChanged");
                    return;
                }
                //kovetkezo ertek vizsgalata
                i++;
            }
        }
    }

    @Override
    public ElementType getType() {
        //tipus: andgate
        return ElementType.ANDGate;
    }

}

